package com.csap.framework.oauth2.server;

import cn.dev33.satoken.oauth2.model.AccessTokenModel;
import com.csap.framework.annotation.apidoc.ApiOperation;
import com.csap.framework.extension.result.ResultParam;
import com.csap.framework.oauth2.request.AuthorizeRequest;
import com.csap.framework.oauth2.request.DoConfirmRequest;
import com.csap.framework.oauth2.request.MobileLoginRequest;
import com.csap.framework.oauth2.request.PlatformRequest;
import com.csap.framework.oauth2.request.RegisterRequest;
import com.csap.framework.oauth2.request.TokenRequest;
import com.csap.framework.oauth2.request.UpdateRequest;
import com.csap.framework.oauth2.response.RegisterResponse;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import javax.validation.constraints.NotEmpty;

/**
 * @Author ycf
 * @Date 2023/11/9 14:56
 * @Version 1.0
 */
public interface Oauth2ServerEndpointApi {
    /**
     * 模式一：Code授权码/隐藏式登录
     *
     * @param authorizeRequest 请求数据
     * @return 返回结果
     */
    Object authorize(AuthorizeRequest authorizeRequest);

    /**
     * 模式一，模式三，模式四：Code授权码 获取 Access-Token
     *
     * @param tokenRequest 授权数据
     * @return 返回token
     */
    Object token(TokenRequest tokenRequest);

    /**
     * 模式一：授权登录
     *
     * @param username 账号
     * @param password 密码
     * @return 返回登录结果
     */
    Object doLogin(@RequestParam @NotEmpty(message = "登录账号不能为空") String username, @RequestParam @NotEmpty(message = "登录密码不能为空") String password);

    /**
     * 模式一：确认授权
     *
     * @param confirmRequest 参数
     * @return 返回授权结果
     */
    Object doConfirm(DoConfirmRequest confirmRequest);

    /**
     * 注册
     *
     * @param registerRequest 请求参数
     * @return 结果
     */
    RegisterResponse register(@RequestBody RegisterRequest registerRequest);

    /**
     * 根据opendId删除用户
     *
     * @param openId   用户的openId
     * @param clientId 客户端ID
     * @return 结果
     */
    Boolean removeByOpenId(@RequestParam @NotEmpty(message = "openId不能为空") String openId, @RequestParam @NotEmpty(message = "clientId不能为空") String clientId);

    /**
     * 一键登录只支持-账号密码
     *
     * @param registerRequest 请求参数
     * @return 返回结果
     */
    ResultParam<AccessTokenModel> loginRegister(@RequestBody RegisterRequest registerRequest);

    /**
     * 一键注册，只注册不登录，不判断账号是否存在
     *
     * @param registerRequest 请求参数
     * @return 返回结果
     */
    RegisterResponse onekeyRegister(@RequestBody RegisterRequest registerRequest);

    /**
     * 一键登录只支持-手机号
     *
     * @param registerRequest 请求参数
     * @return 返回结果
     */
    AccessTokenModel loginRegisterMobile(@RequestBody RegisterRequest registerRequest);

    /**
     * 根据手机号码登录
     *
     * @param mobileRequest 手机号登陆参数
     * @return 返回登录的token
     */
    AccessTokenModel loginMobile(@RequestBody MobileLoginRequest mobileRequest);

    /**
     * 根据OpendId修改用户信息
     *
     * @param updateRequest 修改的参数
     * @return 是否修改成功
     */
    Boolean updateByOpenId(@RequestBody UpdateRequest updateRequest);

    /**
     * 添加平台
     *
     * @param platformRequest 平台参数
     * @return 结果
     */
    @ApiOperation("添加平台")
    @PostMapping("addPlatform")
    Boolean addPlatform(@RequestBody PlatformRequest platformRequest);

    /**
     * 修改平台
     *
     * @param platformRequest 平台参数
     * @return 结果
     */
    @ApiOperation("修改平台")
    @PutMapping("updatePlatform")
    Boolean updatePlatform(@RequestBody PlatformRequest platformRequest);
}
